package br.idez.idezJet.integracao.dao;

import java.util.Collection;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import br.idez.idezJet.integracao.vo.CPF;
import br.idez.idezJet.integracao.vo.RG;
import br.idez.idezJet.integracao.vo.Usuario;

@Stateless
public class UsuarioDAOImpl implements UsuarioDAO{

	@PersistenceContext
	private EntityManager em;
	
	public UsuarioDAOImpl(){
		
	}

	@Override
	public void incluir(Usuario o) throws Exception{
		em.persist(o);
	}

	@Override
	public void alterar(Usuario o) throws Exception{
		o.setCpf(this.buscarCPFUsuario(o.getId()));
		o.setRg(this.buscarRGUsuario(o.getId()));
		o.setNumCartaoMilhas(this.buscarCartaoMilhasUsuario(o.getId()));
		em.merge(o);
	}
	
	private CPF buscarCPFUsuario(Integer idUsuario){
		Query query = em.createQuery("select u.cpf from Usuario u where u.id = " + idUsuario);
		return (CPF) query.getSingleResult();
	}
	
	private RG buscarRGUsuario(Integer idUsuario){
		Query query = em.createQuery("select u.rg from Usuario u where u.id = " + idUsuario);
		return (RG) query.getSingleResult();
	}
	
	private Long buscarCartaoMilhasUsuario(Integer idUsuario){
		Query query = em.createQuery("select u.numCartaoMilhas from Usuario u where u.id = " + idUsuario);
		return (Long) query.getSingleResult();
	}

	@Override
	public Usuario consultar(Usuario o) throws Exception{
		return em.find(Usuario.class, o.getId());
	}

	@Override
	public Collection<Usuario> listar() throws Exception{
		Query query = em.createQuery("select u from Usuario u");
		return query.getResultList();
	}

	@Override
	public Collection<Usuario> listar(Usuario o) throws Exception{
		return null;
	}
	
	public Usuario consultarUsuarioSenha(Usuario o) throws Exception {
		return (Usuario) em.createQuery("select u from Usuario u where u.email = '" + o.getEmail() + "' and u.senha = '" + o.getSenha()+"'").getSingleResult();
	}

	@Override
	public void excluir(Usuario o) throws Exception{
		o = em.merge(o);
		em.remove(o);
	}

}
